import * as XLSX from "xlsx";
import type { School } from "../types/school";
import { cityCodeMap, schoolTypes, schoolControlTypes } from "../types/school";

interface ExcelSchool {
  学校名称: string;
  地址: string;
  地市: string;
  区县: string;
  "乡镇（街道）": string;
  "社区（村）": string;
  学校类型: string;
  经度: number;
  纬度: number;
  学生人数规模: string;
  上学高峰时段: string;
  下学高峰时段: string;
  接送管控的类别: string;
  联系电话?: string;
  责任中队: string;
  中队负责人: string;
  负责人联系电话: string;
  是否上传秩序管控方案: string;
}

// 检查必填字段
const requiredFields = [
  "学校名称",
  "地址",
  "地市",
  "区县",
  "乡镇（街道）",
  "学校类型",
  "经度",
  "纬度",
  "学生人数规模",
];

export function parseExcel(
  file: File
): Promise<{ schools: School[]; hasErrors: boolean }> {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = (e) => {
      try {
        const data = new Uint8Array(e.target?.result as ArrayBuffer);
        const workbook = XLSX.read(data, { type: "array" });

        // 获取第一个工作表
        const sheetName = workbook.SheetNames[0];
        const worksheet = workbook.Sheets[sheetName];

        // 将工作表转换为JSON
        const excelSchools = XLSX.utils.sheet_to_json<ExcelSchool>(worksheet);

        const schools: School[] = [];
        let hasErrors = false;

        excelSchools.forEach((item) => {
          // 检查数据完整性
          const isComplete = requiredFields.every(
            (field) =>
              item[field as keyof ExcelSchool] !== undefined &&
              item[field as keyof ExcelSchool] !== ""
          );

          if (!isComplete) {
            hasErrors = true;
          }

          // 合并上下学高峰时段
          const peakHours = [
            item["上学高峰时段"] || "",
            item["下学高峰时段"] || "",
          ]
            .filter(Boolean)
            .join(",");

          // 查找地市编码
          const cityInfo = cityCodeMap.find(
            (city) => city.name === item["地市"]
          );
          const dsCode = cityInfo ? cityInfo.code : "";

          const school: School = {
            xxmc: item["学校名称"] || "",
            dz: item["地址"] || "",
            lxdh: item["联系电话"] || "",
            ds: item["地市"] || "",
            dsCode: dsCode,
            qx: item["区县"] || "",
            jd: item["乡镇（街道）"] || "",
            sq: item["社区（村）"] || "",
            xxlx: item["学校类型"] || "",
            jd1: Number(item["经度"]) || 0,
            wd: Number(item["纬度"]) || 0,
            xsrsgm: String(item["学生人数规模"]) || "",
            sxxgfsd: peakHours,
            jsgklb: item["接送管控的类别"] || "",
            isComplete: isComplete,
            zrzd: item["责任中队"] || "",
            zdfzr: item["中队负责人"] || "",
            fzrlxdh: item["负责人联系电话"] || "",
            sfsczxgkfa: item["是否上传秩序管控方案"] || "",
          };

          schools.push(school);
        });

        resolve({ schools, hasErrors });
      } catch (error) {
        reject(error);
      }
    };

    reader.onerror = (error) => {
      reject(error);
    };

    reader.readAsArrayBuffer(file);
  });
}

// 创建Excel下载模板
export function downloadTemplate() {
  // 表头
  const headers = [
    "学校名称",
    "地址",
    "地市",
    "区县",
    "乡镇（街道）",
    "社区（村）",
    "学校类型",
    "经度",
    "纬度",
    "学生人数规模",
    "上学高峰时段",
    "下学高峰时段",
    "接送管控的类别",
    "联系电话",
    "责任中队",
    "中队负责人",
    "负责人联系电话",
    "是否上传秩序管控方案",
  ];

  // 示例数据
  const exampleData = [
    {
      学校名称: "示例小学",
      地址: "杭州市西湖区示例路123号",
      地市: "杭州市",
      区县: "西湖区",
      "乡镇（街道）": "示例街道",
      "社区（村）": "示例社区",
      学校类型: "小学",
      经度: 120.2,
      纬度: 30.2,
      学生人数规模: "1000",
      上学高峰时段: "07:30-08:30",
      下学高峰时段: "16:00-17:00",
      接送管控的类别: "地下接送管理",
      联系电话: "13800138000",
      责任中队: "西湖中队",
      中队负责人: "张三",
      负责人联系电话: "13900139000",
      是否上传秩序管控方案: "是",
    },
  ];

  // 创建工作簿和工作表
  const wb = XLSX.utils.book_new();
  const ws = XLSX.utils.json_to_sheet(exampleData, { header: headers });

  // 设置列宽
  ws["!cols"] = [
    { wch: 15 }, // 学校名称
    { wch: 30 }, // 地址
    { wch: 10 }, // 地市
    { wch: 10 }, // 区县
    { wch: 15 }, // 乡镇（街道）
    { wch: 15 }, // 社区（村）
    { wch: 10 }, // 学校类型
    { wch: 10 }, // 经度
    { wch: 10 }, // 纬度
    { wch: 15 }, // 学生人数规模
    { wch: 15 }, // 上学高峰时段
    { wch: 15 }, // 下学高峰时段
    { wch: 20 }, // 接送管控的类别
    { wch: 15 }, // 联系电话
    { wch: 15 }, // 责任中队
    { wch: 15 }, // 中队负责人
    { wch: 15 }, // 负责人联系电话
    { wch: 20 }, // 是否上传秩序管控方案
  ];

  // 将工作表添加到工作簿
  XLSX.utils.book_append_sheet(wb, ws, "学校信息");

  // 添加数据验证（下拉列表）
  const lastRow = exampleData.length + 1; // 包括表头

  // 地市下拉选项
  const cityValidationRange = {
    s: { r: 1, c: 2 }, // 从第二行开始（跳过表头）
    e: { r: lastRow, c: 2 } // 到最后一行的"地市"列
  };
  ws["!dataValidation"] = [{
    type: "list",
    allowBlank: true,
    showInputMessage: true,
    showErrorMessage: true,
    sqref: XLSX.utils.encode_range(cityValidationRange),
    formulas: [`"${cityCodeMap.map(city => city.name).join(',')}"`]
  }];

  // 学校类型下拉选项
  const schoolTypeValidationRange = {
    s: { r: 1, c: 6 }, // 从第二行开始（跳过表头）
    e: { r: lastRow, c: 6 } // 到最后一行的"学校类型"列
  };
  ws["!dataValidation"] = [...(ws["!dataValidation"] || []), {
    type: "list",
    allowBlank: true,
    showInputMessage: true,
    showErrorMessage: true,
    sqref: XLSX.utils.encode_range(schoolTypeValidationRange),
    formulas: [`"${schoolTypes.join(',')}"`]
  }];

  // 接送管控类别下拉选项
  const controlTypeValidationRange = {
    s: { r: 1, c: 12 }, // 从第二行开始（跳过表头）
    e: { r: lastRow, c: 12 } // 到最后一行的"接送管控的类别"列
  };
  ws["!dataValidation"] = [...(ws["!dataValidation"] || []), {
    type: "list",
    allowBlank: true,
    showInputMessage: true,
    showErrorMessage: true,
    sqref: XLSX.utils.encode_range(controlTypeValidationRange),
    formulas: [`"${schoolControlTypes.join(',')}"`]
  }];

  // 是否上传秩序管控方案下拉选项
  const uploadValidationRange = {
    s: { r: 1, c: 17 }, // 从第二行开始（跳过表头）
    e: { r: lastRow, c: 17 } // 到最后一行的"是否上传秩序管控方案"列
  };
  ws["!dataValidation"] = [...(ws["!dataValidation"] || []), {
    type: "list",
    allowBlank: true,
    showInputMessage: true,
    showErrorMessage: true,
    sqref: XLSX.utils.encode_range(uploadValidationRange),
    formulas: ['"是,否"']
  }];

  // 生成Excel文件并下载
  XLSX.writeFile(wb, "学校信息导入模板.xlsx");
}
